#include <stdio.h>
#include <stdint.h>
#include <string.h>

/**
 * @brief 判断系统是否为大端序
 * @return 1表示大端序，0表示小端序
 */
int is_big_endian()
{
    union
    {
        uint16_t num;
        uint8_t  bytes[2];
    } test = { 0x1234 };

    return test.bytes[0] == 0x12;
}

/**
 * @brief 打印系统的字节序信息
 */
void print_endian_info()
{
    if ( is_big_endian() )
    {
        printf( "Running on a big-endian system.\n" );
    }
    else
    {
        printf( "Running on a little-endian system.\n" );
    }
}

/**
 * @brief 打印16位整数的低8位字节
 * @param vlen 16位整数值
 * @note 记录一个实际开发中遇到的问题。
 *       之前开发中使用的小端平台（包括Linux软仿）没有注意到这个问题。
 *       以下代码在大端平台下会出错：
 */
void print_low_byte(uint16_t vlen)
{
    uint8_t data = 0;
    memcpy( &data, (uint8_t*)&vlen, 1 );
    printf( "%x", data );
}

/**
 * @mainpage 字节序测试程序
 *
 * @section 大端平台编译运行结果：使用powerpc-linux-gnu-gcc编译，运行在x86_64架构的Linux上，此为大端平台
 * powerpc-linux-gnu-gcc -static -o big_little.ppc big_little.c
 * qemu-ppc-static  ./big_little.ppc
 * Running on a big-endian system.
 * Original value: 0x1234
 * Big-endian representation: 12%
 *
 * @section 小端平台编译运行结果
 * /workspaces/demo_cos/9_test % gcc big_little.c
 * /workspaces/demo_cos/9_test % ./a.out
 * Running on a little-endian system.
 * Original value: 0x1234
 * Big-endian representation: 34%
 */

typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;
void hash(u32* key, u32 len, u32 *out)
{
    //在此打印key的地址，以及key的值
    printf("\nkey: %p, value: %x\n", key, *key);
}
void test_hash()
{
    u8 key[10] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34};
    printf("\nkey: %p, value: %x\n", key, key[0]);
    hash((u32*)(key+2), 10, NULL);
}

int main()
{
    print_endian_info();
    printf( "原始值: 0x1234\n" );
    printf( "实际平台字节序表示: " );
    print_low_byte( 0x1234 );

    test_hash();
    return 0;
}